﻿using System.Collections.Generic;
using Wedn.Core.Entity;

namespace Wedn.Interface.DAL
{
    /// <summary>
    /// 关系表操作类接口
    /// </summary>
    public interface IRelation
    {
        #region 增加记录
        /// <summary>
        /// 向关系表中插入一行新数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="relation">要插入的对象</param>
        /// <returns>执行结果受影响行数</returns>
        int Insert(Relation relation);
        #endregion

        #region 删除记录

        #region 删除一条
        /// <summary>
        /// 根据关系ID删除对应的关系记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除记录的ID</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int id);
        #endregion

        #region 删除多条
        /// <summary>
        /// 根据关系ID数组删除对应的关系记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除记录的ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int[] ids);

        /// <summary>
        /// 根据关系对象删除一个其所有关系, 返回执行结果受影响行数
        /// </summary>
        /// <param name="objectId">关系对象ID</param>
        /// <param name="objectType">关系对象类型</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int objectId, string objectType);
        #endregion

        #endregion

        #region 更新记录

        #region 更新一个完整对象
        /// <summary>
        /// 更新一个完整的关系对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="relation">要更新的对象</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateRelation(Relation relation);
        #endregion

        #region 更新常用字段
        /// <summary>
        /// 更新一个关系信息, 返回执行结果受影响行数
        /// </summary>
        /// <param name="objectId">关系对象ID</param>
        /// <param name="objectType">关系对象类型</param>
        /// <param name="oldTermId">原先的标签ID</param>
        /// <param name="newTermId">更新的标签ID</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateInfo(int objectId, string objectType, int oldTermId, int newTermId);

        /// <summary>
        /// 将一个标签ID全部更新为新的标签ID, 返回执行结果受影响行数
        /// </summary>
        /// <param name="oldTermId">原先的标签ID</param>
        /// <param name="newTermId">更新的标签ID</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateTermId(int oldTermId, int newTermId);
        #endregion

        #endregion

        #region 选取记录

        #region 选取表中主键最大值
        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        int SelectMaxId();
        #endregion

        /// <summary>
        /// 根据标签ID和对象类型取出当前关系表中对应的关系对象ID, 不存在则返回null
        /// </summary>
        /// <param name="objectType">关系对象类型</param>
        /// <param name="termId">标签ID</param>
        /// <returns>指定标签指定类型的全部关系对象ID数组</returns>
        int[] SelectObjectId(string objectType, int termId);

        /// <summary>
        /// 根据对象ID和对象类型取出当前关系表中对应的标签ID, 不存在则返回null
        /// </summary>
        /// <param name="objectId">关系对象ID</param>
        /// <param name="objectType">关系对象类型</param>
        /// <returns>指定对象的全部标签ID数组</returns>
        int[] SelectTermId(int objectId, string objectType);

        #region 选取全部关系集合
        /// <summary>
        /// 取出当前关系表中的所有关系信息集合, 不存在则返回null
        /// </summary>
        /// <returns>所有关系信息集合</returns>
        List<Relation> SelectRelationList();
        #endregion

        #region 根据对象ID和对象类型选取全部关系集合
        /// <summary>
        /// 根据对象ID和对象类型取出当前关系表中的所有关系信息集合, 不存在则返回null
        /// </summary>
        /// <param name="objectId">关系对象ID</param>
        /// <param name="objectType">关系对象类型</param>
        /// <returns>包涵指定对象关系信息集合</returns>
        List<Relation> SelectRelationList(int objectId, string objectType);
        #endregion

        #region 根据ID选取关系对象
        /// <summary>
        /// 根据关系ID取出当前关系表中的关系信息对象, 不存在则返回null
        /// </summary>
        /// <param name="id">关系ID</param>
        /// <returns>关系信息对象</returns>
        Relation SelectRelation(int id);
        #endregion

        #endregion
    }
}
